package com.itany.reflex;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * Author:石小俊
 * Date: 2022/11/2 16:01
 */
public class Test05 {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class c = Student.class;

        // 获取当前类以及其父类中的所有public方法
        Method[] methods = c.getMethods();
        System.out.println("当前类与父类中所有public方法:"+ Arrays.toString(methods));

        // 获取当前类中所有方法,不区分修饰符
        methods = c.getDeclaredMethods();
        System.out.println("当前类中所有方法:"+ Arrays.toString(methods));

        // 获取当前类以及其父类中指定的public方法
        Method method = c.getMethod("add", int.class, int.class);
        System.out.println(method);

        // 获取当前类中指定的方法,不区分修饰符
        method = c.getDeclaredMethod("add", double.class, double.class);
        System.out.println(method);

        // 通过反射调用方法
        Student student = new Student();
        // 通过反射执行目标方法, 方法的返回值即为目标方法的返回值
        // 参数一: 调用的目标方法所在的对象是谁
        // 参数二: 目标方法的实际参数,可变长参数
        method.setAccessible(true);
        Object result = method.invoke(student, 3, 2);
        System.out.println(method.getName()+"的返回值为:"+result);

        Person p = new Student();
        Student s = new Student();
    }

}
